package cn.bugstack.springframework.beans.factory;

import cn.bugstack.springframework.beans.BeansException;
import cn.bugstack.springframework.beans.factory.config.AutowireCapableBeanFactory;
import cn.bugstack.springframework.beans.factory.config.BeanDefinition;
import cn.bugstack.springframework.beans.factory.config.ConfigurableBeanFactory;

/**
 * 作者：DerekYRC https://github.com/DerekYRC/mini-spring
 * @description Configuration interface to be implemented by most listable bean factories.
 * In addition to {@link ConfigurableBeanFactory}, it provides facilities to
 * analyze and modify bean definitions, and to pre-instantiate singletons.
 *
 * ConfigurableListableBeanFactory 接口是 Spring 框架中的一个关键接口，它继承自 ListableBeanFactory 和 ConfigurableBeanFactory 接口，用于描述一个可配置的可列表的 Bean 工厂。
 * 这个接口定义了一些方法，允许对 Bean 工厂进行配置和管理，同时也提供了对 Bean 元数据的访问能力。一些常见的方法包括：
 * getBeanDefinition(String beanName)：获取给定名字的 Bean 的定义信息。
 * getBeanNamesForType(Class<?> type)：获取指定类型的所有 Bean 的名字。
 * registerSingleton(String beanName, Object singletonObject)：向 Bean 工厂注册单例对象。
 * registerBeanDefinition(String beanName, BeanDefinition beanDefinition)：向 Bean 工厂注册 Bean 定义。
 * 通过实现 ConfigurableListableBeanFactory 接口，可以对 Spring IoC 容器进行更灵活的配置和定制，以满足特定应用程序的需求。
 *
 */

public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {

    BeanDefinition getBeanDefinition(String beanName) throws BeansException;

    void preInstantiateSingletons() throws BeansException;
}
